#include "user_led.h"
#include "math.h"
/**
 * @brief led状态更新函数
 * @param ucled led状态数组
 * @return none
 */
void led_disp(uint8_t *ucled)
{
    //led状态临时存储变量
    uint8_t temp = 0x00;
    //led上次状态存储变量
    static uint8_t temp_old = 0x00;
    //临时变量获取当前led状态
    for(uint8_t i = 0;i < 6;i++)
    {
        if(ucled[i] == 1)
        {
            temp |= (1 << i);
        }
    }
    //led状态更新
    if(temp != temp_old)
    {
        //GPIO状态更新
        HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,(temp & 0x01)?GPIO_PIN_SET:GPIO_PIN_RESET);
        HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,(temp & 0x02)?GPIO_PIN_SET:GPIO_PIN_RESET);
        HAL_GPIO_WritePin(LED3_GPIO_Port,LED3_Pin,(temp & 0x04)?GPIO_PIN_SET:GPIO_PIN_RESET);
        HAL_GPIO_WritePin(LED4_GPIO_Port,LED4_Pin,(temp & 0x08)?GPIO_PIN_SET:GPIO_PIN_RESET);
        //HAL_GPIO_WritePin(LED5_GPIO_Port,LED5_Pin,(temp & 0x10)?GPIO_PIN_SET:GPIO_PIN_RESET);
        HAL_GPIO_WritePin(LED6_GPIO_Port,LED6_Pin,(temp & 0x20)?GPIO_PIN_SET:GPIO_PIN_RESET);       
        //旧状态更新
        temp_old = temp; 
    }
}

/*呼吸灯实现*/
#define led_period 10//led pwm周期
uint16_t count = 0;//计数变量
float step = 0.00314;//正弦波步长
float x_term = -2*3.14;//正弦波横轴参数 0 - 2Pi
//led灯占空比存储数组
uint16_t duty_buf[6] = {led_period,led_period,led_period,led_period,led_period,led_period};
/**
 * @brief 呼吸灯实现逻辑函数
 * @param none
 * @return none
 */
void led_pwm(void)
{
	count = (++count)%led_period;
	for(uint8_t j = 0;j <= 5;j++)
	{
		float temp_x = (x_term + j*step*333);//调整每个灯的初相位
		//限幅
		if(temp_x > 2 * 3141592614)
		temp_x -= 2 * 3.1415926;
		//获取正弦波占空比
		duty_buf[j] = (sin(temp_x)*0.45 + 0.55) * led_period;					
	}
	//更新步长
    x_term += step;
	//步长限幅
    if(x_term > 2 * 3.1415926)
        x_term = 0;
	//模拟pwm输出
	for(uint8_t i = 0;i<6;i++)
	{
		if(count <= duty_buf[i])
			ucled[i] = 1;
		else
			ucled[i] = 0;
	}
	led_disp(ucled);
}

